#pragma once
#include <iostream>
#include <unistd.h>
#include <pthread.h>
#include "Mutex.hpp"
// 这个文件是对同步的条件变量进行包装，方便后面的线程池进行提前准备，并且可以额帮助后面的基于循环队列的生产者消费者模型

using namespace MutexMoble;

namespace CondMoble
{
    class Cond
    {
    public:
        Cond()
        {
            pthread_cond_init(&_cond, nullptr); // 对条件变量进行初始化
        }

        // 由于我们需要用到锁，因为我们需要访问临街资源，所以需要进行解锁处理
        void Wait(Mutex &mutex)
        {
            int n = pthread_cond_wait(&_cond, mutex.GetMutex());
            (void)n;
        }

        // 对一个线程进行叫醒处理
        void Signal()
        {
            int n = pthread_cond_signal(&_cond);
            (void)n;
        }

        // 对所有睡眠的线程进行叫醒处理

        void Brodcast()
        {
            int n = pthread_cond_broadcast(&_cond);
            (void)n;
        }
        ~Cond()
        {
            pthread_cond_destroy(&_cond);
        }

    private:
        pthread_cond_t _cond; // 定义一个条件变量的类型
    };

    // 可以模仿一下锁接口，上面是描述锁，这里是组织锁

    //不对，这里实现不了，因为条件变量接口也需要锁的接口，这样难以保证锁的接口一样，太麻烦了，越简单越好
    // class Lucrd
    // {
    //     Lucrd(Cond& cond) : _cond(cond)
    //     {
    //         _cond.Wait();
    //     }
    //     ~Lucrd()
    //     {
    //         _cond
    //     }
    // private:
    //     Cond _cond;
    // };
}
